问题: 如何用正则表达式替换字符串中的指定内容(re.sub()基础用法)?
👇 点击展开/折叠 面试背诵模板(建议先背这个)
re.sub(pattern, repl, string, count=0, flags=0) 用于将字符串中所有匹配 pattern 的子串替换为 repl,返回新字符串。原字符串不变。repl 可以是普通字符串(支持 \1、\2 等反向引用捕获组),也可以是函数(接收 Match 对象,返回替换字符串)。count 参数控制最大替换次数,默认 0 表示全部替换。flags 用于设置匹配模式(如 re.IGNORECASE)。常见用法:数据脱敏(隐藏手机号中间四位)、格式统一(将多种日期格式替换为标准格式)、内容清理(移除 HTML 标签)。
---
基础用法示例
1 2 3 4 5 6 7 8
| import re text = "手机号: 13812345678, 备用: 13987654321"
print(re.sub(r'\d', 'X', text))
print(re.sub(r'\d', 'X', text, count=1))
|
使用反向引用(捕获组)进行灵活替换
反向引用 \1、\2 等可引用匹配到的捕获组内容,实现保留部分内容的替换。
1 2 3 4 5 6 7 8 9
| phone = "13812345678" masked = re.sub(r'(\d{3})\d{4}(\d{4})', r'\1****\2', phone) print(masked)
text = "今天日期是 2024-10-01" converted = re.sub(r'(\d{4})-(\d{2})-(\d{2})', r'\3/\2/\1', text) print(converted)
|
使用函数作为替换参数(动态替换)
若替换逻辑复杂(如根据匹配内容动态计算新值),可将 repl 设为函数,函数接收 Match 对象,返回字符串。
1 2 3 4 5 6
| def double(match): value = int(match.group(0)) return str(value * 2)
text = "价格: 100元, 折扣: 20元" print(re.sub(r'\d+', double, text))
|
常见应用场景速览
| 场景 |
示例模式 |
替换目标 |
| 移除 HTML 标签 |
<[^>]+> |
替换为空字符串 |
| 统一空格 |
\s+ |
替换为单个空格 |
| 脱敏邮箱(保留首尾) |
(\w{2})\w+@(\w+) |
r'\1***@\2' |
| 过滤非数字字符 |
\D |
替换为空(仅保留数字) |
1 2 3 4
| print(re.sub(r'\D', '', 'abc123def456'))
print(re.sub(r'\s+', ' ', 'hello world'))
|
注意事项(性能与陷阱)
re.sub 默认替换所有匹配项,若只需替换首次,设置 count=1。
- 替换字符串中的反斜杠
\ 需使用原始字符串 r'',避免转义冲突(如 \1 在普通字符串中需写为 \\1)。
- 若替换内容中包含
\ 或 & 等特殊字符,需视情况额外转义(re.escape 可自动转义字符串中的特殊字符)。